/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package ejb;

import dtos.EncomendaDTO;
import entidades.Encomenda;
import entidades.Farmacia;
import entidades.Fornecedor;
import entidades.LinhaEncomenda;
import entidades.ProdutoCatalogo;
import excecoes.EntidadeNaoExistenteException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.ejb.EJBException;
import javax.ejb.Stateless;
import javax.mail.MessagingException;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

/**
 *
 * @author Joel
 */
@Stateless
public class EncomendaBean {

    @PersistenceContext
    private EntityManager em;
    private EmailBean emailBean;
    private LinhaEncomendaBean leBean;

    public void criarEncomenda(int encomendaId, Date dataEncomenda, int codFarmacia) throws EntidadeNaoExistenteException {
        try {
            
            if (existeEncomenda(encomendaId)){
                throw new EntidadeNaoExistenteException("Encomenda existente!");
            }
            Farmacia farmacia = em.find(Farmacia.class, codFarmacia);

            if (farmacia == null) {
                throw new EntidadeNaoExistenteException("Farmacia não existente!");
            }
            Encomenda e = new Encomenda(encomendaId, dataEncomenda, farmacia);
            farmacia.addEncomenda(e);
            em.merge(farmacia);
            em.persist(e);
            
        }catch (Exception e) {
            throw new EJBException(e.getMessage());
        }
    }
    
    public void alterarEncomenda(int encomendaId, Date dataEncomenda, int farmaciaId) throws EntidadeNaoExistenteException {
        try {
            Encomenda e = em.find(Encomenda.class, encomendaId);
            if (e == null){
                throw new EntidadeNaoExistenteException("Encomenda não existente!");
            }
            Farmacia f = em.find(Farmacia.class, farmaciaId);
            if (f == null) {
                throw new EntidadeNaoExistenteException("Farmacia não existente!");
            }
            
            e.setDataEncomenda(dataEncomenda);
            e.setFarmacia(f);
            
            em.merge(e);
            
        }catch (Exception e) {
            throw new EJBException(e.getMessage());
        }
    }  

    public void alterarLinha(int encomendaId, int linhaEncomendaId, int quantidade) {
        try {
            Encomenda encomenda = em.find(Encomenda.class, encomendaId);
            LinhaEncomenda linhaEncomenda = em.find(LinhaEncomenda.class, linhaEncomendaId);
            if (leBean.atualizarLinhaEncomenda(linhaEncomendaId, quantidade) == 0) {
                encomenda.removerLinhaEncomenda(linhaEncomenda);
            }
                
            em.merge(encomenda);
            
        } catch (Exception e) {
            throw new EJBException(e.getMessage());
        }
    }
    
    public void adicionarLinha(int encomendaId, int codProduto ,int quantidade) {
        try {
            Encomenda encomenda = em.find(Encomenda.class, encomendaId);
            if (encomenda == null) {
                throw new EntidadeNaoExistenteException("Encomenda não existente!");
            }
            leBean.criarLinhaEncomenda(encomenda.getNextLinhaEncomendaId(), encomendaId, quantidade, codProduto);
        } catch (Exception e) {
            throw new EJBException(e.getMessage());
        }
    }
    
    public void submeterEncomenda(int codEncomenda) throws MessagingException, EntidadeNaoExistenteException {

        Encomenda encomenda = em.find(Encomenda.class, codEncomenda);
        String email = "";
        if (encomenda == null) {
            throw new EntidadeNaoExistenteException("Encomenda não existente!");
        }

        for (LinhaEncomenda linhasEncomenda : encomenda.getListaLinhasEncomenda()) {
                
           ProdutoCatalogo produtoCatalogo = em.find(ProdutoCatalogo.class, linhasEncomenda.getProdutoCatalogo().getId());

                for (Fornecedor fornecedor : produtoCatalogo.getListaFornecedores()) {

                    email = produtoCatalogo.getListaFornecedores().get(0).getEmail();
                    
                    //verificacao se 2 produtos forem iguais so envia 1 email
                    //nao se se tá certo
                    if (email.equals(fornecedor.getEmail())) {

                        emailBean.send(fornecedor.getEmail(), "Encomenda nr : " + encomenda.getId(),
                                "Produtos Encomendados : " + encomenda.getListaLinhasEncomenda().toString()
                                + "Data de Encomenda : " + encomenda.getDataEncomenda());
                        encomenda.setEstado("Encomenda submetida!");
                    } else {

                        emailBean.send(fornecedor.getEmail(), "Encomenda nr : " + encomenda.getId(),
                                "Produtos Encomendados : \n" + encomenda.getListaLinhasEncomenda().toString()
                                + "\nData de Encomenda : " + encomenda.getDataEncomenda() + "\nObrigado!");
                        encomenda.setEstado("Encomenda submetida!");

                    }

            }
        }

    }

    public List<EncomendaDTO> getAllEncomendas() {

        try {
            List<Encomenda> encomendas = (List<Encomenda>) em.createNamedQuery("findAllEncomendas").getResultList();
            return copiarEncomendasParaDTOs(encomendas);
        } catch (Exception e) {
            throw new EJBException(e.getMessage());
        }

    }

    public EncomendaDTO getEncomenda(int id) {

        try {
            Encomenda encomenda = em.find(Encomenda.class, id);
            return (encomenda
                    != null) ? copiarEncomendaParaDTO(encomenda)
                            : null;
        } catch (Exception e) {
            throw new EJBException(e.getMessage());
        }

    }

    private List<EncomendaDTO> copiarEncomendasParaDTOs(List<Encomenda> encomendas) {

        List<EncomendaDTO> dtos = new ArrayList<>();

        for (Encomenda e : encomendas) {
            dtos.add(new EncomendaDTO(e.getId(), e.getDataEncomenda(), e.getFarmacia().getId(), e.getEstado()));
        }
        return dtos;
    }

    private EncomendaDTO copiarEncomendaParaDTO(Encomenda e) {
        return new EncomendaDTO(e.getId(), e.getDataEncomenda(), e.getFarmacia().getId(), e.getEstado());

    }

    public boolean existeEncomenda(int id) {
        return em.find(Encomenda.class, id) != null;
    }

    

}
